package com.atguigu.gulimall.order;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * 1.ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(); 创建线程池
 * int corePoolSize, 核心线程数量 会一直存中
   int maximumPoolSize,最大线程数量 执行完毕后会释放
   long keepAliveTime, 只要线程空闲大于指定核心线程 就会在这个线程就会停掉 最终线程只能等于或小于核心线程数
   TimeUnit unit, 时间单位
   BlockingQueue<Runnable> workQueue, 阻塞队列 当核心线程数满了的时候 会放入阻塞队列中
   ThreadFactory threadFactory, 线程的创建工厂
   RejectedExecutionHandler handler 如果线程满了 按照指定的拒绝策略拒绝线程
 */

/**
 * 1.工作顺序
 * 1.1）线程池创建 准备好核心线程
 * 1.2）核心线程满了 就将新进来的线程放入阻塞队列中
 * 1.3）阻塞队列满了 则直接开启新的线程 但最大不能开到maximumPoolSize
 * 1.4）如果max满了 则用RejectedExecutionHandler拒绝任务
 * 1.5）max都执行完成 有很多空闲 在指定的时间以后keepAliveTime 释放线程
 */

/**
 * 解决事务方法内互调
 * 1）导入依赖
 *  <dependency>
        <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
 * 2) @EnableAspectJAutoProxy  spring默认的动态代理时jdk动态代理 必须有接口 开启之后以后所有的动态代理都是aspectj（不需要接口）
 *exposeProxy = true  对外暴露代理对象
 *
 */
@EnableTransactionManagement
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableRabbit
@EnableFeignClients
@EnableDiscoveryClient
@EnableRedisHttpSession
@SpringBootApplication
public class GulimallOrderApplication {

	public static void main(String[] args) {
		SpringApplication.run(GulimallOrderApplication.class, args);

	}

}
